package com.xyzwps.lib.express.router.annotation.openapi;

import com.xyzwps.lib.openapi.element.Schema;

import java.util.regex.Pattern;

import static com.xyzwps.lib.dollar.Dollar.*;

public final class SchemaFrom {

    public static Schema from(IntegerSchema s) {
        var r = new Schema.IntegerSchema();

        if ($.isNotBlank(s.title())) {
            r.title(s.title());
        }

        if ($.isNotBlank(s.description())) {
            r.description(s.description());
        }

        r.deprecated(s.deprecated());
        r.defaultValue(s.defaultValue());
        r.format(s.format());
        r.example(s.example());

        if (s.multipleOf() > 0) {
            r.multipleOf(s.multipleOf());
        }

        if (s.maximum() > Long.MIN_VALUE) {
            r.maximum(s.maximum());
        }

        if (s.minimum() < Long.MAX_VALUE) {
            r.minimum(s.minimum());
        }

        if (s.exclusiveMaximum() > Long.MIN_VALUE) {
            r.exclusiveMaximum(s.exclusiveMaximum());
        }

        if (s.exclusiveMinimum() < Long.MAX_VALUE) {
            r.exclusiveMinimum(s.exclusiveMinimum());
        }

        return r;
    }

    public static Schema from(StringSchema s) {
        var r = new Schema.StringSchema();

        if ($.isNotBlank(s.title())) {
            r.title(s.title());
        }

        if ($.isNotBlank(s.description())) {
            r.description(s.description());
        }

        r.deprecated(s.deprecated());

        if ($.isNotBlank(s.defaultValue())) {
            r.defaultValue(s.defaultValue());
        }

        r.format(s.format());

        if ($.isNotBlank(s.example())) {
            r.example(s.example());
        }

        if (s.minLength() >= 0) {
            r.minLength(s.minLength());
        }

        if (s.maxLength() >= 0) {
            r.maxLength(s.maxLength());
        }

        if ($.isNotBlank(s.pattern())) {
            try {
                Pattern.compile(s.pattern());
                r.pattern(s.pattern());
            } catch (Exception ignored) {
            }
        }

        return r;
    }
}
